﻿#include <iostream>
#include "Add.h"



void ignoreLine()
{
	std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

//删除函数
void test() = delete;
void test() {}

//删除所有不匹配的重载
// 这个函数模版将会匹配其它所有类型
// 因为这个函数模版被删除，因此匹配到它，将会导致编译失败
template <typename T>
void printInt(T x) = delete;



int main()
{
	std::cout << "Hello World!\n";


	// 这里来处理失败
	std::cin.clear(); // 将std::cin调回 '正常' 模式 
	ignoreLine();     // 移除缓存中的错误数据

	//类型转换
	int i{ 2 };
	double d{ 3.5 };
	std::cout << typeid(i + d).name() << ' ' << i + d << '\n'; // 显示 i + d 结果的类型

	std::cout << typeid(5u - 10).name() << ' ' << 5u - 10 << '\n'; // 5u 意味着无符号值 5

	//静态转换
	char c{ 'a' };
	std::cout << c << ' ' << static_cast<int>(c) << '\n'; // 打印 97

	using d = double; //把d定义为double的别名
	using Miles = long; // 定义 Miles 作为类型 long 的别名
	using Speed = long; // 定义 Speed 作为类型 long 的别名

	Miles distance{ 5 }; // distance 定义为 long
	Speed mhz{ 3200 };  // mhz 定义为 long

	// 下面的赋值语法上有效 (但通常有语义问题)
	distance = mhz;

	//类型推导
	auto d{ 5.0 }; // 5.0 是 double 字面值, 所以 d 是 double 类型
	auto i{ 1 + 2 }; // 1 + 2 结果是 int, 所以 i 是 int 类型
	auto x{ i }; // i 是 int, 所以 x 也是 int 类型

	//在大多数情况下，类型推导将从推导的类型中删除const或constexpr限定符
	const int x{ 5 }; // x 的类型是 const int
	auto y{ x };      // y 的类型时 int (const 限定符被丢掉)


	//使用重载函数
	std::cout << ADD::add(1, 2) << "\n";
	std::cout << ADD::add(1.2f, 2.2f) << "\n";
	std::cout << ADD::add(1.888, 2.5555) << "\n";

	//由于调用了delete，所以这里的函数调用会报错
	//test();

	//调用具有默认参数的方法
	ADD::print(2); //默认参数生效
	ADD::print(2,3);//覆盖默认参数
	ADD::printTest(); //全部使用默认参数
	ADD::printTest(1,2,3); //全部使用默认参数
}
